/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores.ABMOrdenesDeProduccion;

import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.entidades.DetalleOrden;
import estructurassa.entidades.OrdenDeProduccion;
import estructurassa.entidades.ProductoTerminado;
import estructurassa.expertos.ExpertoABMOrdenDeProduccion;
import estructurassa.expertos.ExpertoABMProductoTerminado;
import estructurassa.expertos.ExpertoStock;
import estructurassa.expertos.excepciones.ABMOrdenDeProducicionException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ControladorABMOrdenDeProduccion implements Controlador {

    PantallaABMOrdenes pantalla;
    PantallaOrdenJDialog pantallaOrdenJDialog;
    ExpertoABMOrdenDeProduccion experto;
    ExpertoABMProductoTerminado expertoProductos;
    ExpertoStock expertoStock;
    OrdenDeProduccion orden = new OrdenDeProduccion();
    ProductoTerminado productoTerminado = new ProductoTerminado();
    DetalleOrden detalle = new DetalleOrden();
    private boolean iniciado = false;

    public ControladorABMOrdenDeProduccion() {

        pantalla = new PantallaABMOrdenes();
        pantallaOrdenJDialog = new PantallaOrdenJDialog(null, true);
        pantallaOrdenJDialog.setLocationRelativeTo(null);
        experto = new ExpertoABMOrdenDeProduccion();
        expertoProductos = new ExpertoABMProductoTerminado();
        expertoStock = new ExpertoStock();

        pantalla.getTablaOrdenes().setModel(new ModeloTablaOrdenes());
        pantallaOrdenJDialog.getTablaDetalles().setModel(new ModeloTablaDetalles());
        pantallaOrdenJDialog.getTablaProductos().setModel(new ModeloTablaProductos());

        agregarAccionesABotones();

        agregarAccionesABotonesJDialog();




    }

    public List getListaElementos(String nombreLista) {
        if (nombreLista.equalsIgnoreCase("productos")) {
            List listaElementosTablaProductos = ((ModeloTablaProductos) pantallaOrdenJDialog.getTablaProductos().getModel()).getListaElementos();
            return listaElementosTablaProductos;
        }
        if (nombreLista.equalsIgnoreCase("ordenes")) {
            List listaElementosTablaOrdenes = ((ModeloTablaOrdenes) pantalla.getTablaOrdenes().getModel()).getListaElementos();
            return listaElementosTablaOrdenes;
        }
        if (nombreLista.equalsIgnoreCase("detalles")) {
            List listaElementosTablaDetalles = ((ModeloTablaDetalles) pantallaOrdenJDialog.getTablaDetalles().getModel()).getListaElementos();
            return listaElementosTablaDetalles;
        }
        return null;
    }

    public void setListaElementos(String nombreLista, List lista) {
        if (nombreLista.equalsIgnoreCase("productos")) {
            ((ModeloTablaProductos) pantallaOrdenJDialog.getTablaProductos().getModel()).setListaElementos(lista);

        }
        if (nombreLista.equalsIgnoreCase("ordenes")) {
            ((ModeloTablaOrdenes) pantalla.getTablaOrdenes().getModel()).setListaElementos(lista);

        }
        if (nombreLista.equalsIgnoreCase("detalles")) {
            ((ModeloTablaDetalles) pantallaOrdenJDialog.getTablaDetalles().getModel()).setListaElementos(lista);

        }

    }

    public void addElementoALista(String nombreLista, Object objeto) {
        if (nombreLista.equalsIgnoreCase("productos")) {
            ((ModeloTablaProductos) pantallaOrdenJDialog.getTablaProductos().getModel()).getListaElementos().add(objeto);
            ((ModeloTablaProductos) pantallaOrdenJDialog.getTablaProductos().getModel()).fireTableDataChanged();

        }
        if (nombreLista.equalsIgnoreCase("ordenes")) {
            ((ModeloTablaOrdenes) pantalla.getTablaOrdenes().getModel()).getListaElementos().add(objeto);
            ((ModeloTablaOrdenes) pantalla.getTablaOrdenes().getModel()).fireTableDataChanged();

        }
        if (nombreLista.equalsIgnoreCase("detalles")) {
            ((ModeloTablaDetalles) pantallaOrdenJDialog.getTablaProductos().getModel()).getListaElementos().add(objeto);
            ((ModeloTablaDetalles) pantallaOrdenJDialog.getTablaProductos().getModel()).fireTableDataChanged();
        }

    }

    public void removerElementoLista(String nombreLista, Object objeto) {
        if (nombreLista.equalsIgnoreCase("productos")) {
            ((ModeloTablaProductos) pantallaOrdenJDialog.getTablaProductos().getModel()).getListaElementos().remove(objeto);

        }
        if (nombreLista.equalsIgnoreCase("ordenes")) {
            ((ModeloTablaOrdenes) pantalla.getTablaOrdenes().getModel()).getListaElementos().remove(objeto);

        }
        if (nombreLista.equalsIgnoreCase("detalles")) {
            ((ModeloTablaDetalles) pantallaOrdenJDialog.getTablaProductos().getModel()).getListaElementos().remove(objeto);

        }

    }

    private void agregarAccionesABotones() {

        pantalla.getBtnNuevo().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                nuevaOrden();
            }
        });


        pantalla.getBotonConfirmarEntrega().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                confirmarEntregaDeOrden();
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });

        pantalla.getTablaOrdenes().addMouseListener(new MouseAdapter() {

            int filaSeleccionada = -1;

            @Override
            public void mousePressed(MouseEvent e) {

                int indiceModelo = pantalla.getTablaOrdenes().convertRowIndexToModel(pantalla.getTablaOrdenes().rowAtPoint(e.getPoint()));
                int fila = pantalla.getTablaOrdenes().rowAtPoint(e.getPoint());
                if (fila > -1) {
                    filaSeleccionada = fila;
                    orden = (OrdenDeProduccion) getListaElementos("ordenes").get(fila);



                }
            }
        });


    }

    private void agregarAccionesABotonesJDialog() {
        pantallaOrdenJDialog.getBtnSalirJDialog().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                salirJDialog();
            }
        });
        pantallaOrdenJDialog.getBtnGuardar().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                guardar();
            }
        });
        pantallaOrdenJDialog.getBotonAgregarAPedido().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                crearDetallePedido();
            }
        });

        pantallaOrdenJDialog.getTablaProductos().addMouseListener(new MouseAdapter() {

            int filaSeleccionada = -1;

            @Override
            public void mousePressed(MouseEvent e) {
                int indiceModelo = pantallaOrdenJDialog.getTablaProductos().convertRowIndexToModel(pantalla.getTablaOrdenes().rowAtPoint(e.getPoint()));
                int fila = pantallaOrdenJDialog.getTablaProductos().rowAtPoint(e.getPoint());
                if (fila > -1) {
                    filaSeleccionada = fila;
                    productoTerminado = (ProductoTerminado) getListaElementos("productos").get(fila);
                }
            }
        });

        pantallaOrdenJDialog.getTablaDetalles().addMouseListener(new MouseAdapter() {

            int filaSeleccionada = -1;

            @Override
            public void mousePressed(MouseEvent e) {
                int indiceModelo = pantallaOrdenJDialog.getTablaDetalles().convertRowIndexToModel(pantalla.getTablaOrdenes().rowAtPoint(e.getPoint()));
                int fila = pantallaOrdenJDialog.getTablaDetalles().rowAtPoint(e.getPoint());
                if (fila > -1) {
                    filaSeleccionada = fila;
                    detalle = (DetalleOrden) getListaElementos("detalles").get(fila);
                }
            }
        });

    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            iniciado = true;
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
        } else {
            pantalla.setVisible(true);
        }
        setListaElementos("productos", expertoProductos.buscarProductosTerminados());
        setListaElementos("ordenes", experto.buscarOrdenes());
    }

    public void salir() {
        pantalla.setVisible(false);
    }

    public void salirJDialog() {
        pantallaOrdenJDialog.setVisible(false);
    }

    public void guardar() {
        if (orden == null) {
            orden = new OrdenDeProduccion();
        }
        List detalles = ((ModeloTablaDetalles) pantallaOrdenJDialog.getTablaDetalles().getModel()).getListaElementos();
        if (detalles.size() > 0) {
            orden.setListaDetalles(detalles);
            orden.setFechaDeOrden(new Date());
            orden.setOrdenActiva(true);

            try {
                experto.guardar(orden);
                addElementoALista("ordenes", orden);
            } catch (ABMOrdenDeProducicionException ex) {
                System.out.println("ERROR!!!!: " + ex.getMessage());
            }
        }

        limpiarPantallaJDialog();

    }

    public void nuevaOrden() {
        limpiarPantallaJDialog();
        pantallaOrdenJDialog.setVisible(true);

    }

    public void limpiarPantallaJDialog() {
        pantallaOrdenJDialog.getTextoCantidad().setText("");
        setListaElementos("detalles", null);
        //((ModeloTablaProductos) pantallaOrdenJDialog.getTablaProductos().getModel()).setListaElementos(null);
        orden = null;
        productoTerminado = null;
        detalle = null;
    }

    public void crearDetallePedido() {
        if (pantallaOrdenJDialog.getTextoCantidad().getText().length() > 0 && ((ModeloTablaProductos) pantallaOrdenJDialog.getTablaProductos().getModel()).getListaElementos().size() > 0) {
            DetalleOrden nuevoDetalle = new DetalleOrden();
            nuevoDetalle.setCantidad(Long.parseLong(pantallaOrdenJDialog.getTextoCantidad().getText()));
            nuevoDetalle.setProductoTerminado(productoTerminado);
            List lista = getListaElementos("detalles");
            lista.add(nuevoDetalle);
            setListaElementos("detalles", lista);
        }
    }

    public void confirmarEntregaDeOrden() {
        if (orden != null) {
            if (orden.getEstadoActual().getEstado().equalsIgnoreCase("Entregada") == false) {
                
                orden.setFechaDeEntrega(new Date());
                try {
                    experto.entregarOrden(orden);
                    //expertoStock.darDeBajaStockDeOrden(orden);
                } catch (ExcepcionFachada ex) {
                    Logger.getLogger(ControladorABMOrdenDeProduccion.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {
                JOptionPane.showMessageDialog(null, "La orden seleccionada ya ha sido entregada");
            }
        }
    }
}
